home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / cross / Avr.lha / Atmel / INCCT_Programmer / Src / timer.c < prev   
C/C++ Source or Header  |  1999-04-18  |  2KB  |  104 lines

  1. #include <exec/types.h>
  2. #include <exec/io.h>
  3. #include <exec/memory.h>
  4. #include <devices/timer.h>
  5.  
  6. #include <clib/exec_protos.h>
  7. #include <clib/alib_protos.h>
  8. #include <clib/dos_protos.h>
  9.  
  10. #include <stdio.h>
  11.  
  12. void delete_timer  (void);
  13. void wait_for_timer(struct timeval *);
  14. LONG time_delay    ( struct timeval *);
  15. int create_timer( void );
  16.  
  17. struct timerequest *tr;
  18.  
  19. struct Library *TimerBase;   
  20.  
  21. void delay(int Milliseconds)
  22. {
  23. struct timeval currentval;
  24.  
  25. currentval.tv_secs = 0;
  26. currentval.tv_micro = 1000*Milliseconds;
  27.  
  28. time_delay( ¤tval);
  29. }
  30.  
  31. int create_timer(void)
  32. {
  33. /* return a pointer to a timer request.  If any problem, return NULL */
  34. LONG error;
  35. ULONG unit= UNIT_MICROHZ ;
  36. struct MsgPort *timerport;
  37. struct timerequest *TimerIO;
  38.  
  39. timerport = CreatePort( 0, 0 );
  40. if (timerport == NULL )
  41.     return( 0 );
  42.  
  43. TimerIO = (struct timerequest *)
  44.     CreateExtIO( timerport, sizeof( struct timerequest ) );
  45. if (TimerIO == NULL )
  46.     {
  47.     DeletePort(timerport);   /* Delete message port */
  48.     return( 0 );
  49.     }
  50. tr=TimerIO ;
  51. error = OpenDevice( TIMERNAME, unit,(struct IORequest *) TimerIO, 0L );
  52. if (error != 0 )
  53.     {
  54.     delete_timer();
  55.     return(0);
  56.     }
  57.  
  58. return 1;
  59. }
  60.  
  61. /* more precise timer than AmigaDOS Delay() */
  62. LONG time_delay( struct timeval *tv)
  63. {
  64.  
  65. /* any nonzero return says timedelay routine didn't work. */
  66. if (tr == NULL )
  67.     return( -1L );
  68.  
  69. wait_for_timer(tv);
  70.  
  71. /* deallocate temporary structures */
  72.  
  73. return( 0L );
  74. }
  75.  
  76. void wait_for_timer( struct timeval *tv )
  77. {
  78.  
  79. tr->tr_node.io_Command = TR_ADDREQUEST; /* add a new timer request */
  80.  
  81. /* structure assignment */
  82. tr->tr_time = *tv;
  83.  
  84. /* post request to the timer -- will go to sleep till done */
  85. DoIO((struct IORequest *) tr );
  86. }
  87.  
  88. void delete_timer(void)
  89. {
  90. struct MsgPort *tp;
  91.  
  92. if (tr != 0 )
  93.     {
  94.     tp = tr->tr_node.io_Message.mn_ReplyPort;
  95.  
  96.     if (tp != 0)
  97.         DeletePort(tp);
  98.  
  99.     CloseDevice( (struct IORequest *) tr );
  100.     DeleteExtIO( (struct IORequest *) tr );
  101.     }
  102. }
  103.  
  104.